import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'

Vue.use(VueRouter)

// 先把VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

// 重写push|replace
// 第一个参数：告诉原来push方法，你往哪里跳（传递哪些参数）
// 第二个参数：成功回调
// 第三个参数：失败回调
VueRouter.prototype.push = function(location,resolve,reject){   //resolve,reject成功与失败
    if(resolve && reject){
        // originPush()，不可以这么调用，因为这样调用，this是window
        // call与apply的区别
        // 相同点：都可以调用函数一次，都可以篡改函数的上下文this一次
        // 不同点：call与apply传递参数：call传递参数用逗号隔开；apply方法执行，传递数组
        originPush.call(this,location,resolve,reject);   //这样调用，this是VueRouter类的实例
    }else{
        originPush.call(this,location,()=>{},()=>{});
    }
}
VueRouter.prototype.replace = function(location,resolve,reject){
    if(resolve && reject){
        originReplace.call(this,location,resolve,reject);
    }else{
        originReplace.call(this,location,()=>{},()=>{});
    }
}

const router = new VueRouter({
    routes,
    // 滚动行为,路由跳转的时候滚动条位置
    scrollBehavior (to, from, savedPosition) {
        // 返回的这个y=0，代表的滚动条在最上方
        return {y:0};
    }
})

// 全局守卫：前置守卫（在路由跳转之前进行判断）
router.beforeEach(async(to,from,next)=>{   //next放行
                                           // to：获取到你要跳转到哪个路由信息
                                           // from:获取你从哪个路由跳转而来的信息
                                           // next:放行函数  写法：next();   next(path);放行到指定的路由   next(false);
    next();
})

export default router;
